2

Phoenix アプリケーションのユーザー チャネルにメッセージを送信したいと考えていました。のように、user_token をチャネルに参加させusers:user_tokenましたuser_channel.extoy_controllerブロードキャストメソッドを呼び出すことにより、と呼ばれる別のコントローラーからそれを行うことに成功しました。ブロードキャスト方式はユーザー チャネルにあります。そして、イベントを処理するための jQuery ファイルを作成しました。IoTのことをしたかったので、プロジェクトの外から同じチャンネルにメッセージを送信できるものを探していました。と呼ばれるpythonモジュールとoccamy.socket、それが内部で使用するPhoenixのJSクライアントを試しました。それから、私はいつも切断を見つけました。Phoenix からの Websocket 接続の正確なアドレスがわかりません。そのプロジェクトフォルダー自体にあるそのPhoenix npmライブラリで試している場合、それは言うReferenceError: window is not definedいつも。web/static/js/socket.jsそして、それが次のように書かれているファイル のソケットの初期化部分が原因だと思います

let socket = new Socket("/socket", {params: {token: window.userToken}})                              

、しかしよくわかりません。私が試したことは以下のとおりです

var Socket = require("phoenix-socket").Socket;
var socket = new Socket("ws://localhost:4000/socket");

Python クライアントでも、このアドレスに接続しようとしたところ、切断エラーが発生しました。ユーザーのセンサーデータを監視したいIoTの目的でそれを行いたいです。各ユーザーは、監視する独自のセンサーを持っています。topic:subtopicというわけで、チャンネルchannel を として設定しましたusers:user_token。ユーザーの一意のトークンを使用して、ラズベリーパイからこのチャネルにメッセージを送信する必要があります。私のuser_channel、user.js、app.js、およびsocket.jsを以下に示します。

//web/static/js/socket.js
import {Socket} from "phoenix"

let socket = new Socket("/socket", {params: {token: window.userToken}})


socket.connect()


export default socket

//web/static/app.js


import "phoenix_html"
import user from "./user"

#web/channels/user_channel.ex
defmodule Tworit.UserChannel do
    use Tworit.Web, :channel

    def join("users:" <> user_token, payload, socket) do
        if authorized?(payload) do
          {:ok, "Joined To User:#{user_token}", socket}
      else
          {:error, %{reason: "unauthorized"}}
      end
    end


    def handle_in("ping", payload, socket) do
        {:reply, {:ok, payload}, socket}
    end


    def handle_in("shout", payload, socket) do
       broadcast socket, "shout", payload
       {:noreply, socket}
    end


    def handle_out(event, payload, socket) do
        push socket, event, payload
        {:noreply, socket}
    end


     defp authorized?(_payload) do
       true
     end

    def broadcast_change(toy, current_user) do
       payload = %{
        "name" => toy.name,
        "body" => toy.body
       }
      Tworit.Endpoint.broadcast("users:#{current_user.token}", "change", payload)
    end

end

//web/static/js/user.js
import socket from "./socket"

$(function() {
  let ul = $("ul#em")

  if (ul.length) {
    var token = ul.data("id")
    var topic = "users:" + token
		
    // Join the topic
    let channel = socket.channel(topic, {})
    channel.join()
      .receive("ok", data => {
        console.log("Joined topic", topic)
      })
      .receive("error", resp => {
        console.log("Unable to join topic", topic)
      })
    channel.on("change", toy => {
	    console.log("Change:", toy);
	    $("#message").append(toy["name"])
    })
  }
});

4

1 に答える 1