ruby hardware programming
app/controllers/application_controller.rb
を修正して、Can't verify CSRF token authenticity
を回避します。
class ApplicationController < ActionController::Base
skip_forgery_protection
end
app/controllers/mortor_controller.rb
を作成してモーター制御WebAPIを作成します。
class MortorController < ApplicationController
def control
function_name = params["control"]
send_request(function_name)
render json: [ status: :ok , control: function_name]
end
private
def send_request(function_name)
socket = TCPSocket.open('localhost', 2000)
socket.puts function_name
socket.flush
response = socket.gets
response if response.present?
rescue
nil
ensure
socket.close if socket
end
end
WebAPIのルートを追加します。
RadioControl/config/routes.rb
Rails.application.routes.draw do
post 'mortor/control'
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
動作確認をします。ターミナルを2つ立ち上げます。
1つめ
cd ~/RadioControl
rbenv sudo bundle exec rails mortorcontrol_server:wake_up
2つめ
cd ~/RadioControl
bundle exec rails server -b 0.0.0.0
-b
オプションをつける理由は、外部からアクセスするためです。-b
オプションをつけないと、localhost
からのみアクセスできます。
RaspberryPi の IPアドレスを調べます。
ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet <ここの値> netmask 255.255.255.0 broadcast ?????????
inet6 ????????? prefixlen 64 scopeid 0x20<link>
ether ????????? txqueuelen 1000 (イーサネット)
RX packets 110218 bytes 88854717 (84.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 82412 bytes 15156413 (14.4 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
今操作しているPCでAPIのテストします。
Chrome にアドオン Talend API Tester
を利用すると確認できます。
curl
を使用できる場合は、次のコマンドを実行します。
curl -X POST -H "Content-Type: application/json" -d '{"control": "Forward"}' http://XXX.XXX.XXX.XXX:3000/mortor/control
curl -X POST -H "Content-Type: application/json" -d '{"control": "Left"}' http://XXX.XXX.XXX.XXX:3000/mortor/control
curl -X POST -H "Content-Type: application/json" -d '{"control": "Right"}' http://XXX.XXX.XXX.XXX:3000/mortor/control
curl -X POST -H "Content-Type: application/json" -d '{"control": "Back"}' http://XXX.XXX.XXX.XXX:3000/mortor/control
curl -X POST -H "Content-Type: application/json" -d '{"control": "Breake"}' http://XXX.XXX.XXX.XXX:3000/mortor/control
※XXX XXX XXX.XXXは調べたIPアドレスです。
回答ソースの例はこちら
※ラジコンAPI、ラジコン画面、カメラストリーム配信の対応が入った回答ソースです。