#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <M5StickC.h>
const char* ssid = "WiFiのSSID";
const char* password = "WiFiのパスワード";
WebServer server(80);
typedef struct {
uint32_t length;
uint8_t *buf;
} jpeg_data_t;
jpeg_data_t jpeg_data;
static const int RX_BUF_SIZE = 100000;
static const uint8_t packet_begin[3] = { 0xFF, 0xD8, 0xEA };
void sendPic() {
int state = 1;
WiFiClient client = server.client();
while(state){
if (Serial2.available()) {
digitalWrite(10, LOW);
uint8_t rx_buffer[10];
int rx_size = Serial2.readBytes(rx_buffer, 10);
if (rx_size == 10) {
if ((rx_buffer[0] == packet_begin[0]) && (rx_buffer[1] == packet_begin[1]) && (rx_buffer[2] == packet_begin[2])) {
jpeg_data.length = (uint32_t)(rx_buffer[4] << 16) | (rx_buffer[5] << 8) | rx_buffer[6];
Serial.println(jpeg_data.length);
int rx_size = Serial2.readBytes(jpeg_data.buf, jpeg_data.length);
client.write(jpeg_data.buf, jpeg_data.length);
state = 0;
}
}
}
}
}
void streamPic() {
int state = 1;
while(state){
if (Serial2.available()) {
digitalWrite(10, LOW);
uint8_t rx_buffer[10];
int rx_size = Serial2.readBytes(rx_buffer, 10);
if (rx_size == 10) {
if ((rx_buffer[0] == packet_begin[0]) && (rx_buffer[1] == packet_begin[1]) && (rx_buffer[2] == packet_begin[2])) {
jpeg_data.length = (uint32_t)(rx_buffer[4] << 16) | (rx_buffer[5] << 8) | rx_buffer[6];
Serial.println(jpeg_data.length);
int rx_size = Serial2.readBytes(jpeg_data.buf, jpeg_data.length);
state = 0;
}
}
}
}
WiFiClient client = server.client();
String response = "HTTP/1.1 200 OK\r\n";
response += "Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n";
server.sendContent(response);
while (1) {
digitalWrite(10, HIGH);
if (Serial2.available()) {
digitalWrite(10, LOW);
uint8_t rx_buffer[10];
int rx_size = Serial2.readBytes(rx_buffer, 10);
if (rx_size == 10) {
if ((rx_buffer[0] == packet_begin[0]) && (rx_buffer[1] == packet_begin[1]) && (rx_buffer[2] == packet_begin[2])) {
jpeg_data.length = (uint32_t)(rx_buffer[4] << 16) | (rx_buffer[5] << 8) | rx_buffer[6];
Serial.println(jpeg_data.length);
int rx_size = Serial2.readBytes(jpeg_data.buf, jpeg_data.length);
}
response = "--frame\r\n";
response += "Content-Type: image/jpeg\r\n\r\n";
server.sendContent(response);
client.write(jpeg_data.buf, jpeg_data.length);
server.sendContent("\r\n");
if (!client.connected())
break;
}else{
int rx_size = Serial2.readBytes(rx_buffer, 1);
break;
}
}
if (!client.connected())
break;
}
}
void setup() {
pinMode(10, OUTPUT);
M5.begin();
M5.Axp.ScreenBreath(0);
Serial.begin(115200);
Serial2.begin(1152000, SERIAL_8N1, 32, 33);
jpeg_data.buf = (uint8_t *) malloc(sizeof(uint8_t) * RX_BUF_SIZE);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
server.on("/", []() {
server.send(200, "text/plain", "this works as well");
});
server.on("/pic", HTTP_GET, sendPic);
server.on("/stream", HTTP_GET, streamPic);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
大変申し訳ございません。
こちらの内容に興味を持ち、参考させていただいております。
ブラウザ上で、unitVのカメラからの/stremを見ているのですが、webサーバにアクセス時にはきちんとunitVからの画像が写るのですが、(1秒~30秒)後に、画面が灰色の状態で静止します。chrome上での別のタブに切り替えwebサーバにアクセスすると再度、表示されるのですが、また数秒後には灰色の画面で静止します。原因を探ろうとしたのですが、知識不足で解決に至りませんでした。可能であればなにか教えていただけると幸いです。よろしくお願いいたします。
その現象は経験がないので検証難しいですが
何かわかりましたら報告させていただきます。
宜しくお願い致します。
返答ありがとうございます。大変感謝しております。
当たり前のことかもしれませんが、ブラウザ上の画面が灰色になるとm5stickCのLEDが点滅しなくなります。シリアル通信が原因なんですかね。
大変失礼いたしました。よろしくお願いいたします。
ありがとうございます。
点滅が止まるということはm5stickCがストリーミングを停止しているようですね。
ちょっと原因が分かりませんが
http://[M5StickCのIP]/pic:静止画表示 が複数回やってもうまくいくようであれば
UnitV-m5stickC間の通信は問題なくWiFi回りが原因かと思われます。
あとはブラウザかえてみるとかスマホからアクセスしてみるとかでしょうか。