Phoenix アプリケーションのユーザー チャネルにメッセージを送信したいと考えていました。のように、user_token をチャネルに参加させusers:user_token
ましたuser_channel.ex
。toy_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"])
})
}
});