前提・実現したいこと
arduinoからMilkcocoaを介してsendされた値を受け取って処理する
{key : playern, value : x}
nやxには数字が入りxはint型
下記のエラーはarduinoからsendされたときにlogcatから出力されたためonSendは発生してると考えた
milkcocoaのサーバー上ではvalueが数字であることを確認したため受け取った値はnullではないはず
発生している問題・エラーメッセージ
V/センサーデータ: player1 : null player2 :null I/System.out: Connection to lost!MqttException (0) - java.lang.NumberFormatException: null
該当のソースコード
C
1//Arduino側の処理 2#include <Milkcocoa.h> 3#include <WiFi.h> 4 5#define MILKCOCOA_APP_ID "dogjkn9fo6y" 6#define MILKCOCOA_SERVERPORT 1883 7#define MILKCOCOA_DATASTORE "esp32" 8 9#define ssid "3468959E5ED0" 10#define password "2211586074966" 11 12#define SWITCH_NUMBER 16 //マットスイッチ総数 13#define PLAYER_NUMBER "player1" 14 15const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com"; 16const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID; 17 18WiFiClient client; 19Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID); 20 21//// データ格納用のオブジェクト 22//DataElement elem = DataElement(); 23 24//MUX control pins 25const int s0 = 12; 26const int s1 = 14; 27const int s2 = 27; 28const int s3 = 26; 29 30//MUX in "SIG" pin 31const int SIGPin = 32; 32 33//4bitで接続するチャネルを設定 34const int muxChannel[16][4] = { 35 {0, 0, 0, 0}, //channel 0 36 {1, 0, 0, 0}, //channel 1 37 {0, 1, 0, 0}, //channel 2 38 {1, 1, 0, 0}, //channel 3 39 {0, 0, 1, 0}, //channel 4 40 {1, 0, 1, 0}, //channel 5 41 {0, 1, 1, 0}, //channel 6 42 {1, 1, 1, 0}, //channel 7 43 {0, 0, 0, 1}, //channel 8 44 {1, 0, 0, 1}, //channel 9 45 {0, 1, 0, 1}, //channel 10 46 {1, 1, 0, 1}, //channel 11 47 {0, 0, 1, 1}, //channel 12 48 {1, 0, 1, 1}, //channel 13 49 {0, 1, 1, 1}, //channel 14 50 {1, 1, 1, 1} //channel 15 51}; 52 53void setup() { 54 Serial.begin(115200); 55 delay(10); 56 57 // We start by connecting to a WiFi network 58 59 Serial.println(); 60 Serial.println(); 61 Serial.print("Connecting to "); 62 Serial.println(ssid); 63 64 WiFi.begin(ssid, password); 65 66 while (WiFi.status() != WL_CONNECTED) { 67 delay(500); 68 Serial.print("."); 69 } 70 71 Serial.println(""); 72 Serial.println("WiFi connected"); 73 Serial.println("IP address: "); 74 Serial.println(WiFi.localIP()); 75 76 pinMode(s0, OUTPUT); 77 pinMode(s1, OUTPUT); 78 pinMode(s2, OUTPUT); 79 pinMode(s3, OUTPUT); 80 81 pinMode(SIGPin, INPUT); 82 83 digitalWrite(s0, LOW); 84 digitalWrite(s1, LOW); 85 digitalWrite(s2, LOW); 86 digitalWrite(s3, LOW); 87 88// milkcocoa->on(MILKCOCOA_DATASTORE, "send", onsend); 89} 90 91void loop() { 92 // データ格納用のオブジェクト 93 DataElement elem = DataElement(); 94 95 // 以下をloopの中で必ず実行します 96 milkcocoa.loop(); 97 98 for (int i = 0; i < SWITCH_NUMBER; i++) { 99 static int lastValue = 100; 100 if ((readMux(i) < 4000) && (i != lastValue)) { 101 lastValue = i; 102 // データストア名を指定して、データをpushもしくはsendします 103 elem.setValue(PLAYER_NUMBER, i); 104 Serial.println(i); 105 milkcocoa.send(MILKCOCOA_DATASTORE, &elem); 106 delay(1000); 107 } 108 } 109} 110 111//指定されたチャネルのrockの接続状況を読み取る 112int readMux(int channel) { 113 int controlPin[] = {s0, s1, s2, s3}; 114 //loop through the 4 sig 115 for (int i = 0; i < 4; i++) { 116 digitalWrite(controlPin[i], muxChannel[channel][i]); 117 } 118 //read the value at the SIG pin 119 int val = analogRead(SIGPin); 120 return val; 121} 122 123//void onsend(DataElement *elem) { 124// Serial.println(elem.getInt(PLAYER_NUMBER)); 125//}
kotlin
1 milkcocoa = MilkCocoa(app_id) 2 dataStore = milkcocoa?.dataStore(key) 3 dataStore?.addDataStoreEventListener(this) 4 dataStore?.on("send") 5 6 override fun onSended(p0: DataElement?) { 7 8 var p1_current = p0?.getValue("player1") 9 var p2_current = p0?.getValue("player2") 10 11 var test : String = "センサーデータ" 12 13 Log.v(test, "player1 : "+ p1_current +"player2 :" + p2_current) 14 15 var p1_num = Integer.parseInt(p1_current) 16 var p2_num = Integer.parseInt(p2_current) 17 18 var decidePattern : DecidePattern? = DecidePattern() 19 20 var pattern : Int? = decidePattern?.returnpattern(p1_num, p2_num) 21 22 23 decision = pattern 24 25 if(timer != null){ 26 timer?.cancel() 27 } 28 if(pattern == 0){ 29 decideVib = DecideVib(this , handler, pattern, flag[0]) 30 31 for(i in 0..9){ 32 flag[i] = 0 33 } 34 i = 0 35 flag[i] = 1 36 37 timer = Timer(true) 38 timer?.schedule(decideVib, time_pattern[i]) 39 } 40 if(pattern == 1){ 41 decideVib = DecideVib(this , handler, pattern, flag[1]) 42 for(i in 0..9){ 43 flag[i] = 0 44 } 45 i = 1 46 flag[i] = 1 47 48 timer = Timer(true) 49 timer?.schedule(decideVib, time_pattern[i]) 50 } 51 if(pattern == 2){ 52 decideVib = DecideVib(this , handler, pattern, flag[2]) 53 for(i in 0..9){ 54 flag[i] = 0 55 } 56 i = 2 57 flag[i] = 1 58 59 timer = Timer(true) 60 timer?.schedule(decideVib, time_pattern[i]) 61 } 62 if(pattern == 4){ 63 decideVib = DecideVib(this , handler, pattern, flag[3]) 64 for(i in 0..9){ 65 flag[i] = 0 66 } 67 i = 3 68 flag[i] = 1 69 70 timer = Timer(true) 71 timer?.schedule(decideVib, time_pattern[i]) 72 } 73 if(pattern == 5){ 74 decideVib = DecideVib(this , handler, pattern, flag[4]) 75 for(i in 0..9){ 76 flag[i] = 0 77 } 78 i = 4 79 flag[i] = 1 80 81 timer = Timer(true) 82 timer?.schedule(decideVib, time_pattern[i]) 83 } 84 if(pattern == 8){ 85 decideVib = DecideVib(this , handler, pattern, flag[5]) 86 for(i in 0..9){ 87 flag[i] = 0 88 } 89 i = 5 90 flag[i] = 1 91 92 timer = Timer(true) 93 timer?.schedule(decideVib, time_pattern[i]) 94 } 95 if(pattern == 9){ 96 decideVib = DecideVib(this , handler, pattern, flag[6]) 97 for(i in 0..9){ 98 flag[i] = 0 99 } 100 i = 6 101 flag[i] = 1 102 103 timer = Timer(true) 104 timer?.schedule(decideVib, time_pattern[i]) 105 } 106 if(pattern == 10){ 107 decideVib = DecideVib(this , handler, pattern, flag[7]) 108 for(i in 0..9){ 109 flag[i] = 0 110 } 111 i = 7 112 flag[i] = 1 113 114 timer = Timer(true) 115 timer?.schedule(decideVib, time_pattern[i]) 116 } 117 if(pattern == 13){ 118 decideVib = DecideVib(this , handler, pattern, flag[8]) 119 for(i in 0..9){ 120 flag[i] = 0 121 } 122 i = 8 123 flag[i] = 1 124 125 timer = Timer(true) 126 timer?.schedule(decideVib, time_pattern[i]) 127 } 128 if(pattern == 18){ 129 decideVib = DecideVib(this , handler, pattern, flag[9]) 130 for(i in 0..9){ 131 flag[i] = 0 132 } 133 i = 9 134 flag[i] = 1 135 136 timer = Timer(true) 137 timer?.schedule(decideVib, time_pattern[i]) 138 } 139 140 } 141 142 143
試したこと
Logを発生させようと思い記載したらそれぞれの値がnullになったarduino側でdelay1秒いれたがnullのままだった
補足情報(FW/ツールのバージョンなど)
AndroidStudio3.14を使用しています
回答2件
あなたの回答
tips
プレビュー