mirror of
https://github.com/ruvnet/RuView
synced 2026-08-07 20:01:43 +00:00
feat: Implement RSSI service for iOS and Web platforms
- Added IosRssiService to handle synthetic RSSI data for iOS. - Created WebRssiService to simulate RSSI scanning on the web. - Defined shared types for WifiNetwork and RssiService in rssi.service.ts. - Introduced simulation service to generate synthetic sensing data. - Implemented WebSocket service for real-time data handling with reconnection logic. - Established Zustand stores for managing application state related to MAT and pose data. - Developed theme context and utility functions for consistent styling and formatting. - Added type definitions for various application entities including API responses and sensing data. - Created utility functions for color mapping and URL validation. - Configured TypeScript settings for the mobile application.
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
import type { RssiService, WifiNetwork } from './rssi.service';
|
||||
import WifiManager from '@react-native-wifi-reborn';
|
||||
|
||||
type NativeWifiNetwork = {
|
||||
SSID?: string;
|
||||
BSSID?: string;
|
||||
level?: number;
|
||||
levelDbm?: number;
|
||||
};
|
||||
|
||||
class AndroidRssiService implements RssiService {
|
||||
private timer: ReturnType<typeof setInterval> | null = null;
|
||||
private listeners = new Set<(networks: WifiNetwork[]) => void>();
|
||||
|
||||
startScanning(intervalMs: number): void {
|
||||
this.stopScanning();
|
||||
this.scanOnce();
|
||||
this.timer = setInterval(() => {
|
||||
this.scanOnce();
|
||||
}, intervalMs);
|
||||
}
|
||||
|
||||
stopScanning(): void {
|
||||
if (this.timer) {
|
||||
clearInterval(this.timer);
|
||||
this.timer = null;
|
||||
}
|
||||
}
|
||||
|
||||
subscribe(listener: (networks: WifiNetwork[]) => void): () => void {
|
||||
this.listeners.add(listener);
|
||||
return () => {
|
||||
this.listeners.delete(listener);
|
||||
};
|
||||
}
|
||||
|
||||
private async scanOnce(): Promise<void> {
|
||||
try {
|
||||
const results = (await WifiManager.loadWifiList()) as NativeWifiNetwork[];
|
||||
const mapped = results.map((item) => ({
|
||||
ssid: item.SSID || '',
|
||||
bssid: item.BSSID,
|
||||
level: typeof item.level === 'number' ? item.level : typeof item.levelDbm === 'number' ? item.levelDbm : -100,
|
||||
}));
|
||||
this.broadcast(mapped.filter((n) => n.ssid.length > 0));
|
||||
} catch {
|
||||
this.broadcast([]);
|
||||
}
|
||||
}
|
||||
|
||||
private broadcast(networks: WifiNetwork[]): void {
|
||||
this.listeners.forEach((listener) => {
|
||||
try {
|
||||
listener(networks);
|
||||
} catch {
|
||||
// listener safety
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const rssiService = new AndroidRssiService();
|
||||
Reference in New Issue
Block a user