NetworkController的使用

Create a new Header file by going into File->New File->C->Header File. Call it NetworkController.h

Paste this in:


#import "NSObject.h" 

@class NSString, NSTimer;

@interface NetworkController : NSObject {
struct __SCDynamicStore *_store;
NSString *_domainName;
unsigned int _waitingForDialToFinish:1;
unsigned int _checkedNetwork:1;
unsigned int _isNetworkUp:1;
unsigned int _isFatPipe:1;
unsigned int _edgeRequested:1;
NSTimer *_notificationTimer;
}

+ (id)sharedInstance;
- (void)dealloc;
- (id)init;
- (BOOL)isNetworkUp;
- (BOOL)isFatPipe;
- (id)domainName;
- (BOOL)isHostReachable:(id)fp8;
- (id)primaryEthernetAddressAsString;
- (void)registerCTServerRunLoopSource;
- (id)IMEI;
- (id)edgeInterfaceName;
- (BOOL)isEdgeUp;
- (void)bringUpEdge;
- (void)keepEdgeUp;

@end

Then make sure you link against the Message.framework by right clicking on your Target, going to Info, pressing Add, and selecting message.framework.

Then do:


[[NetworkController sharedInstance] keepEdgeUp];
[[NetworkController sharedInstance] bringEdgeUp];

 

 

Socket.m (custom Class I made for wrapping BSD sockets)

- (id)initWithUnixSocket:(int)socket{
self = [super init];
if (self){
sock = socket;
}
return self;
}

- (int)createWithDomain:(int)domain Type:(int)type Protocol:(int)protocol{
sock = socket(domain, type, protocol);
if (sock == -1){
return ERROR;
}
return SUCCESS;
}

- (int)connectToAddress:(const char *)address onPort:(unsigned int)port{
struct sockaddr_in data;
bzero(&data, sizeof(data));
data.sin_family = AF_INET;
data.sin_port = htons(port);
data.sin_addr.s_addr = inet_addr(address);

int result = connect(sock, (const struct sockaddr *)&data, sizeof(data));
if (result == 0){
return SUCCESS;
}
printf("%i", errno);
return ERROR;
}

- (int)bindOnPort:(unsigned int)port{
struct sockaddr_in data;
bzero(&data, sizeof(data));
data.sin_family = AF_INET;
data.sin_port = htons(port);
data.sin_addr.s_addr = INADDR_ANY;

int result = bind(sock, (const struct sockaddr *)&data, sizeof(data));
if (result == 0){
return SUCCESS;
}
return ERROR;
}

- (int)listenWithBackLog:(int)backLog{
int result = listen(sock, backLog);
if (result == 0){
listeningThread = [[NSThread alloc] initWithTarget:self selector:@selector(listeningThread:) object:nil];
[listeningThread start];

return SUCCESS;
}
return ERROR;
}

- (void)listeningThread:(id)object{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

int incomingClient = accept(sock, NULL, NULL);
if (incomingClient != -1){
Socket *incomingSocket = [[Socket alloc] initWithUnixSocket:incomingClient];
incomingSocket.delegate = self.delegate;
if ([delegate respondsToSelector:@selector(connectionAccepted:)]){
[delegate connectionAccepted:incomingSocket];
}
}

[pool release];
}

- (int)sendData:(const char *)data{
int length = strlen(data);

int result = send(sock, data, length, 0);
if (result > 0){
return result;
}
return ERROR;
}

- (void)waitForData{
dataThread = [[NSThread alloc] initWithTarget:self selector:@selector(listenForData:) object:nil];
[dataThread start];
}

- (void)listenForData:(id)object{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

BOOL waitingForData = YES;
while (waitingForData){
const char *buffer[1024];
int length = sizeof(buffer);
int result = recv(sock, &buffer, length, 0);

if (result > 0){
if ([delegate respondsToSelector:@selector(dataReceived:)]){
[delegate dataReceived:buffer];
}
}
}

[pool release];
}

- (void)close{
close(sock);
}


Server Code (Uses Socket.m)



if ([server createWithDomain:AF_INET Type:SOCK_STREAM Protocol:0] == SUCCESS){
[statusText setStringValue:STATUS_CREATED_SOCKET];
if ([server bindOnPort:PORT] == SUCCESS){
[statusText setStringValue:STATUS_BOUND];
if ([server listenWithBackLog:5] == SUCCESS){
[statusText setStringValue:STATUS_WAITING_FOR_CONNECTIONS];
}
}
}



Client Code (Uses Socket.m):

if ([client createWithDomain:AF_INET Type:SOCK_STREAM Protocol:0] == SUCCESS){
canConnect = YES;
}
if (connected == NO){
if (canConnect){
if ([client connectToAddress:[ipField.text UTF8String] onPort:PORT] == SUCCESS){
connected = YES;
}
}
}



[client connectToAddress:[ipField.text UTF8String] onPort:PORT] always fails on EDGE, unless a networked program is started before...

### Controller Area Network (CAN) 的工作原理与实现方式 #### 1. CAN 协议简介 Controller Area Network (CAN),即控制器局域网,是一种多控制器互联的网络结构[^2]。它的设计初衷是为了满足现代车辆内部通信的需求,提供一种高效、可靠的数据交换机制。 #### 2. CAN 总线的工作原理 CAN 使用总线型拓扑结构来连接多个节点设备,并通过差分信号传输数据以提高抗干扰能力。以下是其核心工作机制: - **仲裁机制**:当多个节点尝试在同一时间发送消息时,CAN 利用标识符(ID)进行优先级仲裁。具有较低 ID 值的消息会被赋予更高的优先权并优先处理。 - **错误检测与纠正**:CAN 提供了多种内置机制用于发现和报告传输过程中的错误,包括循环冗余校验(CRC) 和位填充技术等措施。 - **无破坏性竞争访问控制**:即使两个或更多节点几乎同时开始传送帧,在不造成任何实际冲突的情况下也能解决谁先获得介质使用权的问题。 #### 3. 物理层与数据链路层 CAN 协议仅定义了 OSI 模型中的物理层和数据链路层的功能需求。这意味着开发者需要额外选择合适的应用层协议来完成具体的业务逻辑操作。 - **物理层**: 负责规定电气特性以及如何将比特流转换成电信号形式在导线上表示出来; - **数据链路层**: 主要负责封装/解封数据包、执行流量管理及确认服务等功能; #### 4. 应用场景和技术优势 由于其实现简便且成本低廉的特点,除了广泛应用于汽车行业之外,CAN 还被采纳到工业自动化控制系统等领域之中作为现场总线解决方案之一。 #### 5. 技术发展历史 自最初版本发布以来经历了多次迭代升级: - 第一代标准 – 经典 CAN; - 第二代增强版 – CAN Flexible Data-rate (FD); - 最新推出的扩展长度格式 – CAN with eXtra Length (XL). 这些改进不断提高了带宽利用率和支持的最大数据负载量,从而适应日益增长的信息传递密度要求。 ```python import can def send_message(bus, msg_id, data): message = can.Message(arbitration_id=msg_id, data=data, is_extended_id=False) try: bus.send(message) print(f"Message sent on {bus.channel_info}") except can.CanError: print("Message NOT sent") if __name__ == "__main__": bustype = 'socketcan' channel = 'vcan0' with can.interface.Bus(channel=channel, bustype=bustype) as bus: while True: msg = bus.recv() # Blocking receive if msg is not None: print(msg) ``` 上述 Python 示例展示了如何利用 `python-can` 库创建一个简单的 CAN 接口程序来进行基本的消息收发功能测试。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值