質問編集履歴

2

今まで試したこと、今発生しているエラーについて追記させていただきました。

2019/03/05 02:56

投稿

raspypy
raspypy

スコア247

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,149 @@
2
2
 
3
3
 
4
4
 
5
+ **前提・実現したいこと**
6
+
7
+ LINEからのメッセージをトリガにして、LEDを点灯させるプログラムに挑戦しています。
8
+
9
+
10
+
11
+ **発生している問題・エラーメッセージ**
12
+
13
+ goで作成したプログラムを、デプロイした後、通信エラーが発生して困っています。
14
+
15
+ heroku logs --tailで取得したエラーの内容は次の通りです。
16
+
17
+ "crashed"が発生しています。
18
+
19
+ ```html
20
+
21
+ 2019-02-27T12:19:34.034460+00:00 heroku[web.1]: C:\Users\nagata\go\src\applinane>heroku logs --tail
22
+
23
+ 2019-02-27T12:11:48.715153+00:00 app[api]: Enable Logplex by user xxx@yyy
24
+
25
+ 2019-02-27T12:11:48.467341+00:00 app[api]: Release v1 created by user xxx@yyy
26
+
27
+ 2019-02-27T12:11:48.467341+00:00 app[api]: Initial release by user xxx@yyy
28
+
29
+ 2019-02-27T12:11:48.715153+00:00 app[api]: Release v2 created by user xxx@yyy
30
+
31
+ 2019-02-27T12:12:02.405260+00:00 app[api]: Release v3 created by user xxx@yyy
32
+
33
+ 2019-02-27T12:12:02.405260+00:00 app[api]: Set CHANNEL_SECRET config vars by user xxx@yyy
34
+
35
+ 2019-02-27T12:12:18.790510+00:00 app[api]: Release v4 created by user xxx@yyy
36
+
37
+ 2019-02-27T12:12:18.790510+00:00 app[api]: Set CHANNEL_TOKEN config vars by user xxx@yyy
38
+
39
+ 2019-02-27T12:12:40.449883+00:00 app[api]: @ref:cloudmqtt-concave-93011 completed provisioning, setting CLOUDMQTT_APIKEY, CLOUDMQTT_URL. by user xxx@yyy
40
+
41
+ 2019-02-27T12:12:40.433307+00:00 app[api]: Attach CLOUDMQTT (@ref:cloudmqtt-concave-93011) by user xxx@yyy
42
+
43
+ 2019-02-27T12:12:40.433307+00:00 app[api]: Running release v5 commands by user xxx@yyy
44
+
45
+ 2019-02-27T12:12:40.449883+00:00 app[api]: Release v6 created by user xxx@yyy
46
+
47
+ 2019-02-27T12:16:47.670797+00:00 app[api]: Set CLOUDMQTT_URL config vars by user xxx@yyy
48
+
49
+ 2019-02-27T12:16:47.670797+00:00 app[api]: Release v7 created by user xxx@yyy
50
+
51
+ 2019-02-27T12:16:55.988884+00:00 app[api]: Set CLOUDMQTT_URL config vars by user xxx@yyy
52
+
53
+ 2019-02-27T12:16:55.988884+00:00 app[api]: Release v8 created by user xxx@yyy
54
+
55
+ 2019-02-27T12:19:14.000000+00:00 app[api]: Build started by user xxx@yyy
56
+
57
+ 2019-02-27T12:19:28.771183+00:00 heroku[web.1]: Starting process with command `applinane`
58
+
59
+ 2019-02-27T12:19:30.970012+00:00 heroku[web.1]: State changed from starting to crashed
60
+
61
+ 2019-02-27T12:19:30.982047+00:00 heroku[web.1]: State changed from crashed to starting
62
+
63
+ 2019-02-27T12:19:30.949762+00:00 heroku[web.1]: Process exited with status 1
64
+
65
+ 2019-02-27T12:19:30.873884+00:00 app[web.1]: 2019/02/27 12:19:30 missing channel secret
66
+
67
+ 2019-02-27T12:19:31.600270+00:00 heroku[web.1]: Starting process with command `applinane`
68
+
69
+ 2019-02-27T12:19:28.004732+00:00 app[api]: Deploy 0da44f23 by user xxx@yyy
70
+
71
+ 2019-02-27T12:19:28.004732+00:00 app[api]: Release v9 created by user xxx@yyy
72
+
73
+ 2019-02-27T12:19:28.021813+00:00 app[api]: Scaled to web@1:Free by user xxx@yyy
74
+
75
+ 2019-02-27T12:19:34.034460+00:00 heroku[web.1]: State changed from starting to crashed
76
+
77
+ 2019-02-27T12:19:33.958522+00:00 app[web.1]: 2019/02/27 12:19:33 missing channel secret
78
+
79
+ 2019-02-27T12:19:34.020119+00:00 heroku[web.1]: Process exited with status 1
80
+
81
+ 2019-02-27T12:19:47.000000+00:00 app[api]: Build succeeded
82
+
83
+ 2019-02-27T12:21:45.611915+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=applinane.herokuapp.com request_id=6a3f6
84
+
85
+ 501-52a1-4aef-831a-7dfe9231cfde fwd="203.104.146.155" dyno= connect= service= status=503 bytes= protocol=https
86
+
87
+ 2019-02-27T12:19:33.958522+00:00 app[web.1]: 2019/02/27 12:19:33 missing channel secret
88
+
89
+ ```
90
+
91
+
92
+
93
+ **問題が発生するまでの流れ・手順**
94
+
95
+ デプロイが完了するまでの手順を記載します。
96
+
97
+ 通信ログからもデプロイが完了していると考えているので、"crashed"の原因は、goプログラムの内容にあると考えました。
98
+
99
+
100
+
101
+ ```html
102
+
103
+ $ GoPath>cd src
104
+
105
+ $ mkdir appli
106
+
107
+ $ cd appli
108
+
109
+ $ echo web: appli > Procfile
110
+
111
+ $ git init
112
+
113
+ $ git add .
114
+
115
+ $ git commit -m "first commit"
116
+
117
+
118
+
119
+ $ heroku login
120
+
121
+ $ heroku create appli -b https://github.com/heroku/heroku-buildpack-go.git
122
+
123
+ $ heroku config:set --app appli CHANNEL_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
124
+
125
+ $ heroku config:set --app appli CHANNEL_TOKEN="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
126
+
127
+ $ heroku addons:add --app appli cloudmqtt
128
+
129
+ $ heroku config:set --app appli CLOUDMQTT_URL=" xxxxxxx@m16.cloudmqtt.com:25412"
130
+
131
+ //SSLポートに変更しています。
132
+
133
+
134
+
135
+ $ godep save
136
+
137
+ & godep go install
138
+
139
+ $ git add .
140
+
141
+ $ git commit -m "second commit"
142
+
143
+ $ git push heroku master
144
+
145
+ ```
146
+
5
- **概要**
147
+ **ソースコード**
6
148
 
7
149
  次のサイトを参照しながら、goで記述しています。
8
150
 
@@ -10,35 +152,13 @@
10
152
 
11
153
 
12
154
 
13
- **ClientOptionの記述について教えてください**
155
+ ClientOptionを設定する部分の記述の仕方が分かりません
156
+
157
+ herokuで設定した環境変数を設定しなければならないと思っていますが、↓のコードにどのように反映させればよいのかが分かりません。初歩的な質問かもしれませんが、ここの記述の例を示していただけると助かります。
14
158
 
15
159
 
16
160
 
17
- ↓のコードにおいて、設定すべき変数の確認をさせて下さい。
18
-
19
- 次の4つを設定すべきと理解していますが、他に設定すべき項目はありますでしょうか。
20
-
21
- また、設定している値についても、勘違いしているようでしたら、指摘していただけると助かります。
22
-
23
-
24
-
25
- ①tcp://%s
26
-
27
- 設定値: mqtt://kzkyrqws:9dYxxxxxxx@mxx.cloudmqtt.com:25412
28
-
29
- ②uri
30
-
31
- 設定値: heroku CluodMQTTのページで取得したuserの値
32
-
33
- ③password
34
-
35
- 設定値: heroku CluodMQTTのページで取得したPasswordの値
36
-
37
- ④clientid
38
-
39
- 設定値: Line Developers Messasing APIで取得したUser IDの値
161
+ ![イメージ説明](d4280858439470b0b6fe2920459c8366.jpeg)
40
-
41
-
42
162
 
43
163
 
44
164
 

1

質問の内容を明確にしました。

2019/03/05 02:56

投稿

raspypy
raspypy

スコア247

test CHANGED
@@ -1 +1 @@
1
- goプログムにおけるMQTT設定ついて
1
+ golangのmqttクイアントでCloudMQTTにSSL接続するコード
test CHANGED
@@ -1,230 +1,54 @@
1
- ### goプログムにおけるMQTTの設定ついて
1
+ ### golangのmqttクイアントでCloudMQTTにSSL接続するコード
2
2
 
3
3
 
4
4
 
5
5
  **概要**
6
6
 
7
- Heroku上アプリかCloudMQTTを使おうとしています。
7
+ サイトを参照しなが、goで記述しています。
8
8
 
9
- Herokuで設定したCloudMQTTの環境変数をgoプログラムに設定する方法について教えてください。
9
+ 参照先: https://www.cloudmqtt.com/docs-go.html
10
10
 
11
11
 
12
12
 
13
- goプログラムを掲載します
13
+ **ClientOptionの記述について教えてください**
14
-
15
- プログラムの参照元: https://yubeshicat.hatenablog.com/entry/2019/01/05/191903#1-LINE-%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E4%BD%9C%E6%88%90%E3%81%A8%E8%A8%AD%E5%AE%9A
16
14
 
17
15
 
18
16
 
19
- **質問内容**
17
+ ↓のコードにおいて、設定すべき変数の確認をさせて下さい。
20
18
 
21
- プログラムの中で、個別に設定している個所、次の3ヵ所
19
+ 4つを設定すべきと理解していますが、他に設定すべき項目ありますしょうか
22
20
 
23
- 18行目: LineDevelopersで設定したChannel_Secret
21
+ また、設定している値についても、勘違いしているようでしら、指摘していただけると助かります。
24
-
25
- 19行目: LineDevelopersで設定したChannel_Token
26
-
27
- 25行目: Herokuで設定したCloudMQTT_URL
28
-
29
- 25行目の設定は、最後にポート番号も含めて設定しています。(mqtt://kzkyrqws:9dY3UezZWzSH@m16.cloudmqtt.com:15412)
30
22
 
31
23
 
32
24
 
33
- ・他に設定しなければならない箇所はありますでしょうか。
25
+ ①tcp://%s
34
26
 
27
+ 設定値: mqtt://kzkyrqws:9dYxxxxxxx@mxx.cloudmqtt.com:25412
28
+
29
+ ②uri
30
+
31
+ 設定値: heroku CluodMQTTのページで取得したuserの値
32
+
33
+ ③password
34
+
35
+ 設定値: heroku CluodMQTTのページで取得したPasswordの値
36
+
37
+ ④clientid
38
+
35
- ・Herokuで設定したCloudMqttのServer, User, Passwordは、goプログラム中で設定する必要は無いのでしょうか。
39
+ 設定値: Line Developers Messasing APIで取得したUser ID
40
+
41
+
36
42
 
37
43
 
38
44
 
39
45
  ```html
40
46
 
41
- package main
42
-
43
-
44
-
45
- import (
46
-
47
- "crypto/tls"
48
-
49
- "crypto/x509"
50
-
51
- "io/ioutil"
52
-
53
- "log"
54
-
55
- "net/http"
56
-
57
- "net/url"
58
-
59
- "os"
60
-
61
-
62
-
63
- mqtt "github.com/eclipse/paho.mqtt.golang"
64
-
65
- "github.com/line/line-bot-sdk-go/linebot"
66
-
67
- )
68
-
69
-
70
-
71
- func main() {
72
-
73
- bot, err := linebot.New(
74
-
75
- os.Getenv("CHANNEL_SECRET"),
76
-
77
- os.Getenv("CHANNEL_TOKEN"),
78
-
79
- )
80
-
81
- if err != nil {
82
-
83
- log.Fatal(err)
84
-
85
- }
86
-
87
-
88
-
89
- uri, err := url.Parse(os.Getenv("CLOUDMQTT_URL"))
90
-
91
- if err != nil {
92
-
93
- log.Fatal(err)
94
-
95
- }
96
-
97
-
98
-
99
- opts := createClientOptions(uri)
100
-
101
-
102
-
103
- http.HandleFunc("/callback", func(w http.ResponseWriter, req *http.Request) {
104
-
105
-
106
-
107
- header := req.Header
108
-
109
- if params, ok := header["X-Forwarded-Proto"]; ok {
110
-
111
- if len(params) != 0 && params[0] == "http" {
112
-
113
- newURL := "https://" + req.Host + req.URL.Path
114
-
115
- http.Redirect(w, req, newURL, http.StatusMovedPermanently)
116
-
117
- }
118
-
119
- }
120
-
121
-
122
-
123
- events, err := bot.ParseRequest(req)
124
-
125
- if err != nil {
126
-
127
- if err == linebot.ErrInvalidSignature {
128
-
129
- w.WriteHeader(400)
130
-
131
- } else {
132
-
133
- w.WriteHeader(500)
134
-
135
- }
136
-
137
- return
138
-
139
- }
140
-
141
- for _, event := range events {
142
-
143
- if event.Type == linebot.EventTypeMessage {
144
-
145
- switch message := event.Message.(type) {
146
-
147
- case *linebot.TextMessage:
148
-
149
- var returnMessage string
150
-
151
- if message.Text == "つけて" {
152
-
153
- returnMessage = "つけました"
154
-
155
- sendMQTT(opts, "On")
156
-
157
- } else if message.Text == "けして" {
158
-
159
- returnMessage = "けしました"
160
-
161
- sendMQTT(opts, "Off")
162
-
163
- } else {
164
-
165
- returnMessage = "「つけて」でエアコンの電源を入れます。「けして」で消します。"
166
-
167
- }
168
-
169
- if _, err = bot.ReplyMessage(
170
-
171
- event.ReplyToken,
172
-
173
- linebot.NewTextMessage(returnMessage),
174
-
175
- ).Do(); err != nil {
176
-
177
- log.Print(err)
178
-
179
- }
180
-
181
- }
182
-
183
- }
184
-
185
- }
186
-
187
- })
188
-
189
-
190
-
191
- if err := http.ListenAndServe(":"+os.Getenv("PORT"), nil); err != nil {
192
-
193
- log.Fatal(err)
194
-
195
- }
196
-
197
- }
198
-
199
-
200
-
201
- func createClientOptions(uri *url.URL) *mqtt.ClientOptions {
47
+ func createClientOptions(clientId string, uri *url.URL) *mqtt.ClientOptions {
202
-
203
- //TLSconfig
204
-
205
- certpool := x509.NewCertPool()
206
-
207
- severCert, err := ioutil.ReadFile("ca-certificates.crt")
208
-
209
- if err != nil {
210
-
211
- log.Fatal("Could not load server certificate!")
212
-
213
- }
214
-
215
- certpool.AppendCertsFromPEM(severCert)
216
-
217
-
218
-
219
- tlsconfig := &tls.Config{RootCAs: certpool}
220
-
221
-
222
-
223
- //MQTTclient options
224
48
 
225
49
  opts := mqtt.NewClientOptions()
226
50
 
227
- opts.AddBroker("ssl://" + uri.Host)
51
+ opts.AddBroker(fmt.Sprintf("tcp://%s", uri.Host))
228
52
 
229
53
  opts.SetUsername(uri.User.Username())
230
54
 
@@ -232,38 +56,10 @@
232
56
 
233
57
  opts.SetPassword(password)
234
58
 
235
- opts.SetClientID("LINE")
59
+ opts.SetClientID(clientId)
236
-
237
- opts.SetTLSConfig(tlsconfig)
238
60
 
239
61
  return opts
240
62
 
241
63
  }
242
64
 
243
-
244
-
245
- func sendMQTT(opts *mqtt.ClientOptions, sendMessage string) {
246
-
247
- client := mqtt.NewClient(opts)
248
-
249
- if token := client.Connect(); token.Wait() && token.Error() != nil {
250
-
251
- panic(token.Error())
252
-
253
- }
254
-
255
- if token := client.Publish("esp32/aircon", 0, false,
256
-
257
- sendMessage); token.Wait() && token.Error() != nil {
258
-
259
- panic(token.Error())
260
-
261
- }
262
-
263
- client.Disconnect(250)
264
-
265
- }
266
-
267
-
268
-
269
65
  ```