提交 1948ace7 编写于 作者: 云逸之's avatar 云逸之 💬

支持65535个摄像头

上级 c416482a
......@@ -26,7 +26,7 @@ const uint16_t localUdpPort = 2333;
LightUDP streamSender;
// 绑定sn后续为mac 作为sn 代表后续内容是SN 后一位是 6表示SN长度 空位的0 将填充mac
int channel_index = -1;
uint8_t channel_index[2] = {0, 0};
void connectWifi(const char *ssid, const char *passphrase) {
......@@ -101,11 +101,11 @@ void setup() {
WiFiClient client;
uint8_t bind_sn[] = {'S', 'N', ':', 6, 0, 0, 0, 0, 0, 0};
// 将mac设置到 bind_sn 第3
// 将mac设置到 bind_sn 第4
WiFi.macAddress(&bind_sn[4]);
Serial.printf("MAC is:%02X%02X%02X%02X%02X%02X\n", bind_sn[4], bind_sn[5],
bind_sn[6], bind_sn[7], bind_sn[8], bind_sn[9]);
int index;
int length;
do {
while (!client.connect(host, channelBindPort)) {
log_i("connection failed,wait 3 sec...");
......@@ -115,13 +115,9 @@ void setup() {
client.write(bind_sn, 10);
client.flush();
delay(3000);
index = client.read();
} while (index == -1);
if (index <= 255) {
channel_index = index;
log_i("channel_index is : %d ", channel_index);
}
length = client.read(channel_index, 2);
} while (length == -1);
log_i("channel_index is : %d ", channel_index[1] | (static_cast<int>(channel_index[0]) << 8));
client.stop();
streamSender.begin(WiFi.localIP(), localUdpPort);
......@@ -129,14 +125,7 @@ void setup() {
}
void loop() {
// [[noreturn]] 不会执行return这里使用 goto回到行首
return_:
Serial.println("do loop");
if (channel_index == -1) {
log_i("delay 3 sec");
delay(3000);
goto return_;
}
camera_fb_t *fb = NULL;
size_t len;
log_i("send image");
......@@ -148,8 +137,9 @@ void loop() {
break;
}
len = fb->len;
fb->buf[len] = channel_index;
streamSender.send(fb->buf, len + 1);
fb->buf[len++] = channel_index[0];
fb->buf[len++] = channel_index[1];
streamSender.send(fb->buf, len);
esp_camera_fb_return(fb);
}
}
\ No newline at end of file
......@@ -7,4 +7,4 @@ stream.bind.port=8004
frame.delay.skip.timeout=300
udp.video.buffer.pool.size=500
udp.video.dispatcher.thread.size=8
udp.video.channel.size=128
\ No newline at end of file
udp.video.channel.size=300
\ No newline at end of file
......@@ -12,7 +12,7 @@ import java.io.IOException;
import java.util.Properties;
public class UDP2Main {
private static final String version = "0.0.3.1";
private static final String version = "0.0.3.2";
static Properties properties;
static {
......
......@@ -120,9 +120,9 @@ public class NewUDPDeviceChannel extends Thread implements DevChannel {
DatagramPacket datagramPacket = new DatagramPacket(frameBuffer.data, 0, frameBuffer.data.length);
while (runFlag) {
serverSocket.receive(datagramPacket);
// 最后一位是通道索引,故长度 -1 才是照片数据
frameBuffer.size = datagramPacket.getLength() - 1;
frameBuffer.channelIndex = frameBuffer.data[frameBuffer.size] & 0xff;
// 最后二位是通道索引,故长度 -2 才是照片数据
frameBuffer.size = datagramPacket.getLength() - 2;
frameBuffer.channelIndex = ((frameBuffer.data[frameBuffer.size] & 0xff) << 8) | (frameBuffer.data[frameBuffer.size + 1] & 0xff);
frameBuffer.time = System.currentTimeMillis();
frameDispatchers[frameBuffer.channelIndex & dispatcherPoolSize - 1].messages.add(frameBuffer);
// 切换缓冲区
......@@ -208,7 +208,7 @@ public class NewUDPDeviceChannel extends Thread implements DevChannel {
System.arraycopy(snHexVal, 0, snAddr, 1, SN_LEN);
VideoChannel channel = videoServer.createChannel(snAddr);
videoChannelTable[channelIndex] = channel;
if(channel instanceof SoSendCheckTarget){
if (channel instanceof SoSendCheckTarget) {
soSendTimeoutTicker.registerChannel(channelIndex, (SoSendCheckTarget) channel);
}
}
......
......@@ -41,8 +41,8 @@ public class DeviceSnChannelBinder extends Thread {
public DeviceSnChannelBinder(int size, int port) {
super("UDPDeviceSnChannelBinder");
if (size < 0 || size > 0xff) {
throw new IllegalArgumentException("The count of channels can only be between 0~255 ");
if (size < 0 || size > 0xffff) {
throw new IllegalArgumentException("The count of channels can only be between 0~65535 ");
}
for (int i = 0; i < size; i++) {
channelIndexQueue.add(i);
......@@ -94,7 +94,8 @@ public class DeviceSnChannelBinder extends Thread {
}
OutputStream outputStream = cam.getOutputStream();
outputStream.write(index);
outputStream.write((index >> 8) & 0xff);
outputStream.write(index & 0xff);
outputStream.flush();
newUDPDeviceChannel.onNewChannelOpen(index, snBytes);
} catch (IOException e) {
......
......@@ -24,7 +24,7 @@ public class SoSendTimeoutTicker extends Thread {
private int timeout = 300;
private final SoSendCheckTarget[] checkTargets;
private SoSendCheckTarget[] checkTargets;
public void setVideoChannelCount(int videoChannelCount) {
this.videoChannelCount = Math.max(videoChannelCount, 1);
......@@ -36,11 +36,12 @@ public class SoSendTimeoutTicker extends Thread {
public SoSendTimeoutTicker() {
super("SoSendTimeoutTicker");
checkTargets = new SoSendCheckTarget[videoChannelCount];
}
@Override
public void run() {
checkTargets = new SoSendCheckTarget[videoChannelCount];
while (runFlag) {
synchronized (lock) {
try {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册